


ProcessManager = 
{
	ProcessNum = 0,
	Process = {}
}

function ProcessManager:AddProcess(NewP)
	
	local i

	i = 0

	while (i <= self.ProcessNum) do

		

		if (self.Process[i] == nil) then

		

			self.Process[i] = NewP
			NewP.Handler = i

			
			if (i == self.ProcessNum) then
				self.ProcessNum = self.ProcessNum  + 1
			end
			break
		end
		i = i + 1
	end
end

function 
ProcessManager:Run()

	--while true do

		local i

		i = 0

		while (i < self.ProcessNum) do

			if (self.Process[i] ~= nil) then

				if (self.Process[i].Status == ProcessStatus.Run ) then
					self.Process[i]:Main(self.Process[i])
				end
			end
			i = i + 1
		end
		
	--end
end



function ProcessManager:TerminateProcess(PI)

	self.Process[PI] = nil


	if (self.ProcessNum > 0 ) then

		if (PI== self.ProcessNum) then
			self.ProcessNum = self.ProcessNum  - 1
		end
	end
end

function ProcessManager:PauseProcess(PI)

	self.Process[PI].Status = ProcessStatus.Pause
end

function ProcessManager:RunProcess(PI)

	self.Process[PI].Status = ProcessStatus.Run
end

function ProcessManager:ProcessStatus(PI)

	return (self.Process[PI].Status)
end

ProcessStatus = 
{

	Init = 0,
	Run = 1,
	Pause = 2,
	Terminated = 3
}


ProcessObject =
{

	Name = "New Process",
	Status = ProcessStatus.Init,
	Mode = 0,
	Handler = -1,
	Main = function(Me) end,
	OnTerminate = function(Me) end

}

function ProcessObject:New(MainF)

	c = {}
	setmetatable(c,self)
	self.__index =  self

	c.Main = MainF	
	ProcessManager:AddProcess(c)

	return c.Handler
end



--[[
--This is an exsempel of tow working process at once..
F1 = 
function(Me)

	if (Me.Mode < 40)

 then

		screen:print(0,0,"F1",Color.new(255,255,255))
		Me.Mode =  Me.Mode + 1
	
		ProcessManager:RunProcess(PH2)
	end

	if (Me.Mode == 40) then

		screen:print(0,0,"F1 -- Mode 40",Color.new(255,255,255))
	end

end


F2 = function(Me)

	Me.Mode =  Me.Mode + 1

	if (Me.Mode < 70) then

		screen:print(0,50,"F2",Color.new(255,255,255))
	end

	if (Me.Mode > 70 and Me.Mode < 200) then

		screen:print(0,50,"F2 -- Mode 70    Terminate F1",Color.new(255,255,255))
		ProcessManager:TerminateProcess(PH1)
	end


	if (Me.Mode > 200) then

		screen:print(0,50,"F2 -- Mode 100    New Run Of F1",Color.new(255,255,255))
		PH1 = ProcessObject:New(F1)
		ProcessManager:RunProcess(PH1)

	end
end

PH1 = ProcessObject:New(F1)

PH2 = ProcessObject:New(F2)

ProcessManager:RunProcess(PH1)
]]

while true do

	ProcessManager:Run()

	screen:flip()
	screen:waitVblankStart(0)

	screen:fillRect(0,0,480,272)
end